package com.cskaoyan.javase.oop1._11static._2compare;

import com.cskaoyan.javase.oop1._1basic.A;

/**
 * 当我们了解static成员的特点后，静态成员和非静态成员的区别就很明显
 *
 * 我们从以下四个角度比较（拿成员变量为例）
 *
 * 成员的所属
 * 在内存中的位置
 * 在内存中出现的时间
 * 调用方式
 * 其比较的结论如下：
 *
 * 所属不同
 * 静态成员变量属于类，所以也称为为类变量
 * （普通）成员变量属于对象，所以也称为对象变量（实例变量）
 * 在内存中的位置不同
 *
 * 静态变量存储于方法区的静态区，被所有对象共享
 * 成员变量存储于堆内存，每个对象独享自己的成员变量
 * 在内存中出现时间不同
 *
 * 静态变量随着类的加载而加载，比成员变量出现的要早
 * 成员变量随着对象的创建而存在
 *
 * 调用方式不同
 * 静态变量可以通过类名调用，也可以通过对象调用（不推荐/不合理的方式）
 * 成员变量只能通过对象名调用，必须创建对象
 *
 * 思考：
 *      静态成员变量/方法是在类加载结束后，就能够使用的
 *      而成员变量/方法是创建对象之后才能使用的
 *
 *      类加载在前，创建对象在后，这个顺序是一定的
 *      只要创建对象了，就一定类加载了
 *      但是类加载，可不一定创建对象
 *
 *      问题1: 静态成员方法中，能不能访问非static修饰的普通成员呢？ 显然不能，虽然类加载，可不一定创建对象
 *      问题2：普通成员方法中，能不能访问static修饰的静态成员呢？ 显然是可以的 因为只要创建对象了，就一定类加载了
 *
 *
 * @since 11:58
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {

    }
}
class Student{
    static int var;
    int a;
    public static void testStatic(){
        System.out.println(var);
        // 访问普通成员需要创建对象
        Student s = new Student();
        System.out.println(s.a);
        s.test();
        // System.out.println(a);
        // test();
    }
    public void test(){
        System.out.println(var);
        testStatic();
    }
}
